iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0

This

之前提到過在 JavaScript 引擎創造全域執行脈絡時,
在創造階段除了創造全域物件(window)也會創造變數 this ,
this 在瀏覽器的全域執行脈絡中會參考到全域物件(window),

console.log(this);

在 chrome 開發者工具的 console 來確認:

如果在宣告在全域層級的 function 與被匿名 function 賦值的全域變數中來查看 this 會參考到什麼?
會是 function 本身嗎?

function a() {
  console.log(this);
}

var b = function () {
  console.log(this);
}

a();

b();

在 chrome 開發者工具的 console 來確認:

會發現這個 function 中的 this 還是參考到全域物件 window,

那如果是在物件中的方法呢?
宣告一個餐廳物件並在物件中新增方法:

var restaurant = {
  address: '你家巷子口',
  move: function () {
    this.address = '隔壁縣市車站旁天橋下';
    console.log(this);
  }
}

在開發者工具的 console 中會看到 this 參考到餐廳物件:

這時如果我們又在 move 方法中將匿名 function 賦值給 move 方法中的區域變數,
並透過 move 方法中的區域變數來呼叫匿名 function 藉此來查看 this 參考到哪個物件呢?

var restaurant = {
  address: '你家巷子口',
  move: function () {
    this.address = '隔壁縣市車站旁天橋下';
    console.log(this);
    var moveAgain = function () {
      console.log(this);
    }

    moveAgain();
  }
}

restaurant.move();

在開發者工具的 console 中會看到 this 參考到全域物件 window:

如果不想讓餐廳物件的方法中的 function 的 this 參考到全域物件 window,
可以透過以下技巧來卻保餐廳物件方法與方法中的 function 都是參考到餐廳物件:

var restaurant = {
  address: '你家巷子口',
  move: function () {
    var self = this;
    this.address = '隔壁縣市車站旁天橋下';
    console.log(this);
    var moveAgain = function () {
      self.address = "你家附近的全家隔壁"
      console.log(self);
    }

    moveAgain();
  }
}

restaurant.move();

在開發者工具的 console 中查看結果:


上一篇
傳值(by value)與傳參考(by reference)
下一篇
立即執行函數 IIFE
系列文
那些必須了解的 JavaScript 特性與寫程式前的思考17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言